package br.gov.dataprev.treinamento.ejb.service.impl;

import java.util.Date;
import java.util.Set;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.groups.Default;

import br.gov.dataprev.treinamento.ejb.dao.ClienteDaoLocal;
import br.gov.dataprev.treinamento.ejb.excecao.ExcecaoValidacao;
import br.gov.dataprev.treinamento.ejb.modelo.Cliente;
import br.gov.dataprev.treinamento.ejb.service.remote.ClienteServiceRemote;
import br.gov.dataprev.treinamento.ejb.util.ValidacaoUtil;
import br.gov.dataprev.treinamento.ejb.validacao.grupos.Incluir;
import br.gov.dataprev.treinamento.ejb.validacao.grupos.PK;

@Stateless(mappedName=ClienteServiceRemote.EJB_NAME)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class ClienteServiceImpl implements ClienteServiceRemote {
	
	@EJB
	private ClienteDaoLocal clienteDao;
	
	public Cliente incluir(Cliente cliente) throws ExcecaoValidacao{
		
		//ValidacaoUtil.getInstance().validar(cliente, Incluir.class);
		Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
		Set<ConstraintViolation<Cliente>> violacoes = validator.validate(cliente, Incluir.class, Default.class);
		
		if(violacoes != null && violacoes.size() > 0) {
			StringBuffer sb = new StringBuffer();
			
			for (ConstraintViolation<?> violacao : violacoes) {
				sb.append(violacao.getMessage());
				sb.append(" : ");
				sb.append(violacao.getPropertyPath().toString());
				sb.append(" : ");
				sb.append(violacao.getInvalidValue());
				sb.append("\n");
			}
			throw new ExcecaoValidacao(sb.toString());
		}
		
		cliente.setDataCadastro(new Date());
		
		try {
		
		return clienteDao.incluir(cliente);
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return null;
	}

	public Cliente excluir(Cliente cliente) throws ExcecaoValidacao {
		ValidacaoUtil.getInstance().validar(cliente, PK.class);
		return clienteDao.excluir(cliente);
	}
	
	public Cliente alterar(Cliente cliente) throws ExcecaoValidacao {
		ValidacaoUtil.getInstance().validar(cliente, PK.class);
		return clienteDao.alterar(cliente);
	}
	
	@TransactionAttribute(TransactionAttributeType.SUPPORTS)
	public Cliente obterCliente(Long id){
		Cliente cliente = clienteDao.obterCliente(id);
		return cliente;
	}
	

}
